package com.ruoyi.system.commons.utils;

import com.alibaba.druid.pool.ha.selector.StickyDataSourceHolder;

/**
 * @author QiuYuchun
 * Date: 2023/12/16
 * Time: 12:09
 */
public class Constants {

    public static final String TOOL_PROMPT_TEMPLATE = "你是一位${toolSetRole}，你擅长使用“${toolName}”工具来${toolDesc}，以辅助解决客户的问题。\n" +
            "“${toolName}”的输入格式为JSON格式，具体格式如下\n" +
            "{\"工具名称\":\"${toolName}\"${paramModels}}\n" +
            "\"\"中的参数需要你从用户的问题中获取。\n" +
            "你现在需要借助“${toolName}”来辅助解决用户的问题\n" +
            "你的回答只能包含JSON";

    public static final String TOOL_STEP_PROMPT_TEMPLATE = "你现在是一个${toolKitRole}，你现在有${toolNum}个工具来辅助解决用户问题，分别是${toolNameList}，通常为了解决用户问题，你可以根据用户问题中的意图选择如下的一个或多个调用行为：\n" +
            "\n" +
            "${nameDescriptions}\n" +
            "\n" +
            "你现在不需要回答用户问题或者调用这${toolNum}个工具，而是需要把用户的问题按照工具进行拆分，按顺序列出来，你需要生成一个JSON来表示工具的调用，对于每个工具，你需要描述使用这个工具的调用期望，即用这个工具来干什么。你的回答必须是JSON格式，回答格式如下，其中用<>包含的部分是你需要根据自己的判断填写的内容：\n" +
            "{{[{{\"工具调用\":\"<工具名1>\"，\"调用期望\":\"<结合用户问题生成的调用期望>\"}},{{\"工具调用\":\"<工具名2>\",\"调用期望\":\"<结合用户问题生成的调用期望>\"}},...]}}";

    public static final String TOOL_DESC_MODEL = "- 使用“${toolName}”来${toolDescription};\n";

    public static final String PARAM_TEMPLATE = ", \"${paramName}\":\"\"";

    public static final String TOOL_LIST_TEMPLATE = "“${toolName}”、";

    public static final String TK_NAME_TEMPLATE = "“${name}”、";

    public static final String INTENTION_RECOGNITION_SYS_PROMPT =
            "你现在是一个问题分类器，我需要你对问题进行分类，而不是直接回答问题。\n" +
                    "这些问题类型分别是${intentionNamesList}\n" +
                    "${intentionPair}\n" +
                    "你需要从以上${toolkitNum}类问题中选择一类。\n" +
                    "你的回答输出格式为JSON，key为“问题类型”，value为你的分类结果，比如{{\"问题类型\":\"知识库问答\"}}\n" +
                    "你的回答只能包含一个JSON，不能包含其他内容。";

//    public static final String RESULT_INTERPRETATION_PROMPT_TEMPLATE =
//            "你是一个语言组织大师，你擅长把原始的数据包装成为流畅、通顺、有逻辑的句子。用户提出了一个”${toolKitName}”的问题，我们得到了最后的JSON返回结果，JSON返回结果如下：\n" +
//                    "```\n" +
//                    "${lastResult}\n" +
//                    "```\n" +
//                    "其中，返回结果中有很多字段，一些关键字段的含义是：\n" +
//                    "${resExplain}\n" +
//                    "以上就是返回的结果以及相应的解释，用户最开始的问题是：“${userQuestion}”\n" +
//                    "请你将他们进行组织包装从而直接返回流畅、通顺、有逻辑的句子，注意，请不要提及我没有提供过的内容，也不要提及任何提示。";

    public static final String RESULT_INTERPRETATION_PROMPT_TEMPLATE =
            "你现在是一个回答问题机器人，用户先前提出了一个”${toolKitName}”的问题，这个问题是“${userQuestion}”，然后你利用相关工具检索到了以下结果：\n" +
                    "```\n" +
                    "${lastResult}\n" +
                    "```\n" +
                    "其中，返回结果中有很多字段，一些关键字段和其含义的对应关系是：\n" +
                    "${resExplain}\n" +
                    "请你根据检索结果,按关键字分点以Markdown格式回答用户的初始问题，如果检索结果中没有有效信息，请凭借你自己的能力回答";

    public static final String DESC_PAIR_TEMPLATE = "- ${intention}，可以认为该问题属于“${name}”\n";

    public static final String RESULT_CONCLUSION = "后台调用了“${toolName}”，该工具API返回的结果为：\n" +
            "${result}\n" +
            "其中，返回结果中有很多字段，一些关键字段和其含义的对应关系是：\n" +
            "${resExplain}\n" +
            "请帮后台以自然语言的形式总结返回结果,按关键字分点回答，如果api返回多个查询结果则按顺序回答，详细解释所有字段，结果不需要分点以外的内容";

    public static final String DOC_QA_SYS_PROMPT =
            "你现在是一个问答机器人，你可以根据用户的问题从“公共文档库”或者“个人文档库”中寻找相关文件以辅助回答。" +
                    "现在你不需要直接回答问题，而是需要以JSON的格式回答需要在哪个文档库中进行查找。" +
                    "你的回答输出格式为JSON，key为“文档库”，value为“个人文档库”和“公共文档库”中的一个，" +
                    "比如{\"文档库\":\"公共文档库\",\"问题\":\"（用户提的问题）\"}," +
                    "当用户没有提及或者你不能确定从哪个文档库进行检索时，默认选择“公共文档库”" +
                    "你的回答只能包含一个JSON，不能包含其他内容。";

    public static final String ONE_MAP_SYS_PROMPT =
            "你现在是一个河流专家，你现在有两个工具来辅助解决用户问题，" +
                    "分别是“按河流名称查询河流名录工具”和“河流详情查询工具”，" +
                    "通常为了解决用户问题，你需要先根据用户问题中的意图使用“按河流名称查询河流名录工具”来获得和用户问题答案相关的水利对象列表（包含姓名和ID）" +
                    "，然后使用“河流详情查询工具”来根据列表中合适的水利对象的ID获取用户列表中的详细信息以满足用户需求，" +
                    "当然，如果用户直接提供了ID，你只需要调用“河流详情查询工具”以查询详细信息。" +
                    "你现在不需要回答用户问题或者调用这两个工具，而是需要把用户的问题按照工具进行拆分，" +
                    "按顺序列出来，你需要生成一个JSON来表示工具的调用，" +
                    "对于每个工具，需要你描述需要用这个工具来干什么。" +
                    "比如当用户的问题是“列出新疆最短的前10条河”，你的回答JSON就应当为：" +
                    "{\"工具链\":[{\"工具调用\":\"按河流名称查询河流名录工具\",\"调用期望\":\"我需要找出新疆的所有河流，" +
                    "按照河流长度升序排列\"},{\"工具调用\":\"河流详情查询工具\",\"调用期" +
                    "望\":\"找出列表中前10条最短河流的详细信息\"}]}";

    public static final String GET_HYDROELECTRIC_OBJ_LIST_PROMPT =
            "你先是一位河流专家，你擅长使用河流查询工具来对河流进行检索，以辅助解决客户的问题" +
                    "河流查询工具的输入格式为JSON格式，具体格式如下" +
                    "{\"工具名称\":\"河流筛选查询工具\",\"关键字\":\"\",\"河流代码\":\"\",\"河流长度\":{\"最小值\":\"\",\"最大值\":\"\"},\"流域面积\":{\"最小值\":\"\",\"最大值\":\"\"},\"排序\":{\"排序字段\":\"\",\"排序方式\":\"\"}}" +
                    "\"\"中的参数内容需要你填写，参数的具体解释如下" +
                    "“关键字”：用户查询意图中河流的名称关键字，可以模糊查询，可以只输入河流名称的一部分。" +
                    "“河流代码”：用户查询意图中河流的代码，可以模糊查询，可以只输入河流代码的一部分。" +
                    "“河流长度”：用户查询意图中河流的长度，单位是km，是一个范围，如果用户意图中只有最小值，则最大值填写99999，如果意图中只有最大值，则最小值填写0。" +
                    "\"流域面积\"：用户查询意图中流域的面积大小，单位是km^2，是一个范围，如果用户意图中只有最小值，则最大值填写99999，如果意图中只有最大值，则最小值填写0。" +
                    "\"排序\"：决定返回的结果列表的顺序，其中有两个参数，\"排序字段\"可选择为\"流域面积\"或者\"河流长度\"，默认值为\"流域面积\"，\"排序方式\"可以选择填入\"降序\"或者\"升序\"，默认为\"降序\"。" +
                    "在这些参数中，你只需要填写用户问题中有的参数，用户问题没有涉及的参数填写默认值或者null" +
                    "你现在需要借助河流查询工具来辅助解决用户的问题\n" +
                    "你的回答只能包含JSON";

    public static final String GET_HYDROELECTRIC_OBJ_DETAIL_PROMPT =
            "你先是一位河流专家，你擅长使用河流查询工具来对河流进行检索，以辅助解决客户的问题。\n" +
                    "用户的问题是“${question}”，\n" +
                    "${lastResult}\n" +
                    "接下来，你需要根据以上结果获取用户需求水利对象的详细信息，为此，你可以调用“水利对象详细信息查看工具”，你需要生成一个JSON来调用这个工具，具体格式为{\"工具名称\":\"水利对象详细信息查看工具\",\"对象ID\":[]}\n" +
                    "对象ID为需要查询的水利对象的ID列表，按需求填入一个或多个元素，列表中每个元素为字符串例如\"GU0001D\"\n" +
                    "你的回答只能包含JSON，不需要其他内容，比如{\"工具名称\":\"水利对象详细信息查看工具\",\"对象ID\":[\"GU90976Y\",\"DK99978\",\"FFTGH\"]}\n" +
                    "你的JSON：";

    public static String VIEW_ONEMAP_RIVER_PROMPT = "你是一位河流专家，你擅长使用“专题图河流展示工具”来通过用户问题识别用户想要使用筛选条件，以辅助解决客户的问题。\n" +
            "“专题图河流展示工具”的输入格式为JSON格式，具体格式如下\n" +
            "{\"河流编码\":\"\", \"河流名称\":\"\"}\n" +
            "\"\"中的参数需要你从用户的问题中获取。\n" +
            "你现在需要借助“专题图河流展示工具”来辅助解决用户的问题\n" +
            "你的回答只能包含JSON";

    public static String VIEW_ONEMAP_RSW_PROMPT = "你是一位水库专家，你擅长使用“专题图水库展示工具”来通过用户问题识别用户想要使用筛选条件，以辅助解决客户的问题。\n" +
            "“专题图水库展示工具”的输入格式为JSON格式，具体格式如下\n" +
            "{\"水库编码\":\"\", \"水库名称\":\"\"}\n" +
//          "{\"水库编码\":\"\", \"水库名称\":\"\",\"工程规模\":\"\"}\n" +
            "\"\"中的参数需要你从用户的问题中获取。\n" +
//            "\"\"中的参数内容需要你填写，参数的具体解释如下" +
//            "“工程规模”：用户查询意图中水库的规模，规模有以下几种，请按照用户提到的信息：大一型、大二型、中型、小一型、小二型、未知" +
            "你现在需要借助“专题图水库展示工具”来辅助解决用户的问题\n" +
            "你的回答只能包含JSON";

    public static final Long MAX_TOKEN = 8192L;
    public static final String TOO_LONG_RESULT_CONCLUSION_TEMPLATE = "请回复：“返回结果过多，请您前往多模态界面查看详细结果。”";
}
